Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: support depositAndCall and withdrawAndCall with empty message #3018

Merged
merged 20 commits into from
Oct 22, 2024

Conversation

lumtis
Copy link
Member

@lumtis lumtis commented Oct 17, 2024

Description

Currently both would be interpreted as normal dpeosit or withdraw

This PR fix this with using a new field in the inbound and a new type of event in the gateway contracts

Smart contract associated PR: zeta-chain/protocol-contracts#403

Additional fix: set sender in context and remove origin for v2 deposits. In v2 msg.sender is used instead of tx.origin: 1ebd9a5

Summary by CodeRabbit

  • New Features

    • Added support for stateful precompiled contracts and multiple Bitcoin chains.
    • Introduced the ability to lock/unlock ZRC20 tokens and handle authenticated calls for smart contracts.
    • Enhanced staking functionalities and integrated new parameters for transaction handling.
  • Bug Fixes

    • Resolved issues related to observer set duplicates and outbound tracker confirmations.
  • Tests

    • Expanded testing coverage with new end-to-end tests for various deposit and withdrawal scenarios, including ERC20 and Ether transactions.
  • Documentation

    • Updated changelog and API specifications to reflect new functionalities and changes in message definitions.

@lumtis lumtis added V2_TESTS Run make start-v2-test V2_MIGRATION_TESTS Run make start-upgrade-v2-migration-test UPGRADE_LIGHT_TESTS Run make start-upgrade-test-light and removed V2_MIGRATION_TESTS Run make start-upgrade-v2-migration-test labels Oct 17, 2024
Copy link

codecov bot commented Oct 17, 2024

Codecov Report

Attention: Patch coverage is 7.53247% with 356 lines in your changes missing coverage. Please review.

Project coverage is 64.47%. Comparing base (9347165) to head (b719a86).
Report is 2 commits behind head on develop.

Files with missing lines Patch % Lines
x/crosschain/types/inbound_parsing.go 0.00% 150 Missing ⚠️
zetaclient/chains/evm/observer/v2_inbound.go 0.00% 109 Missing ⚠️
x/crosschain/keeper/v2_zevm_inbound.go 1.78% 54 Missing and 1 partial ⚠️
pkg/contracts/testdappv2/TestDAppV2.go 0.00% 28 Missing ⚠️
zetaclient/chains/evm/observer/inbound.go 0.00% 9 Missing ⚠️
x/fungible/keeper/v2_deposits.go 77.77% 0 Missing and 2 partials ⚠️
zetaclient/chains/evm/cctx.go 66.66% 1 Missing and 1 partial ⚠️
x/crosschain/types/cctx.go 0.00% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop    #3018      +/-   ##
===========================================
- Coverage    64.91%   64.47%   -0.45%     
===========================================
  Files          408      409       +1     
  Lines        28407    28641     +234     
===========================================
+ Hits         18441    18465      +24     
- Misses        9170     9381     +211     
+ Partials       796      795       -1     
Files with missing lines Coverage Δ
x/crosschain/keeper/evm_deposit.go 86.84% <100.00%> (+0.11%) ⬆️
x/crosschain/types/message_vote_inbound.go 100.00% <100.00%> (ø)
x/fungible/keeper/deposits.go 96.05% <100.00%> (+0.59%) ⬆️
x/crosschain/types/cctx.go 43.36% <0.00%> (-0.23%) ⬇️
x/fungible/keeper/v2_deposits.go 21.31% <77.77%> (ø)
zetaclient/chains/evm/cctx.go 65.71% <66.66%> (+65.71%) ⬆️
zetaclient/chains/evm/observer/inbound.go 35.28% <0.00%> (-0.53%) ⬇️
pkg/contracts/testdappv2/TestDAppV2.go 0.00% <0.00%> (ø)
x/crosschain/keeper/v2_zevm_inbound.go 3.88% <1.78%> (-6.56%) ⬇️
zetaclient/chains/evm/observer/v2_inbound.go 0.00% <0.00%> (ø)
... and 1 more

changelog.md Show resolved Hide resolved
e2e/runner/v2_zevm.go Outdated Show resolved Hide resolved
x/crosschain/keeper/v2_zevm_inbound.go Outdated Show resolved Hide resolved
@lumtis lumtis marked this pull request as ready for review October 21, 2024 11:05
Copy link
Contributor

coderabbitai bot commented Oct 21, 2024

📝 Walkthrough

Walkthrough

The pull request introduces extensive enhancements to the ZetaChain node, including updates to the changelog, new features, refactoring, testing improvements, and fixes. Key additions encompass support for stateful precompiled contracts, a common RPC package, and enhanced functionalities for staking and Bitcoin transactions. The modifications also include the introduction of new parameters, refined error handling, and expanded testing coverage. Overall, the changes aim to improve the reliability and performance of the ZetaChain protocol.

Changes

File Path Change Summary
changelog.md Updated to reflect new features, refactoring, tests, fixes, and CI improvements across versions.
cmd/zetae2e/local/v2.go Added new test cases for gas and ERC20 token workflows.
docs/openapi/openapi.swagger.yaml Added is_cross_chain_call property to definitions.
docs/spec/crosschain/messages.md Updated MsgVoteInbound to include is_cross_chain_call field.
e2e/e2etests/e2etests.go Introduced new test cases for ETH and ERC20 deposit and withdrawal without messages.
e2e/e2etests/test_v2_erc20_deposit_and_call.go Modified logging message in TestV2ERC20DepositAndCall.
e2e/e2etests/test_v2_erc20_withdraw_and_call_no_message.go Added test for ERC20 withdrawal without a message.
e2e/e2etests/test_v2_eth_deposit_and_call_no_message.go Added test for ETH deposit without a message.
e2e/e2etests/test_v2_eth_withdraw_and_call_no_message.go Added test for ETH withdrawal without a message.
e2e/runner/v2_zevm.go Renamed several methods for clarity and updated parameter types.
go.mod Updated Go version and dependencies, including new ones.
pkg/contracts/testdappv2/TestDAppV2.abi Added functions NO_MESSAGE_CALL and getNoMessageIndex to the ABI.
pkg/contracts/testdappv2/TestDAppV2.go Added implementations for new functions in the Go binding.
proto/zetachain/zetacore/crosschain/cross_chain_tx.proto Added is_cross_chain_call field to InboundParams.
x/crosschain/keeper/evm_deposit.go Updated HandleEVMDeposit to include isCrossChainCall parameter.
x/crosschain/types/cctx.go Added IsCrossChainCall field to InboundParams.
x/crosschain/types/message_vote_inbound.go Added IsCrossChainCall field to MsgVoteInbound and corresponding option setter.
x/crosschain/types/inbound_parsing.go Introduced functions for parsing events from gateway contracts.
x/crosschain/types/inbound_parsing_test.go Created tests for inbound parsing functionalities.
x/fungible/keeper/deposits.go Updated ZRC20DepositAndCallContract to include isCrossChainCall parameter.
x/fungible/keeper/v2_deposits.go Enhanced ProcessV2Deposit to handle cross-chain calls.
zetaclient/chains/evm/cctx.go Modified ParseOutboundTypeFromCCTX to utilize IsCrossChainCall.
zetaclient/chains/evm/observer/inbound.go Added ObserveGatewayDepositAndCall method for event observation.
zetaclient/chains/evm/observer/v2_inbound.go Enhanced event processing methods for deposits and calls.

Possibly related PRs

Suggested labels

UPGRADE_TESTS, TSS_MIGRATION_TESTS

Suggested reviewers

  • gartnera
  • swift1337
  • skosito
  • kingpinXD
  • fbac
  • brewmaster012

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 46

🧹 Outside diff range and nitpick comments (56)
docs/openapi/openapi.swagger.yaml (1)

57205-57209: Approve addition with minor title refinement.

The new is_cross_chain_call property is correctly defined and appropriately placed within the schema. The title provides valuable context for its purpose.

To enhance clarity and maintain consistency with OpenAPI best practices, consider refining the title as follows:

       is_cross_chain_call:
         type: boolean
         title: |-
-          this field describes if a smart contract call should be made for a inbound
-          with assets only used for protocol contract version 2
+          Indicates whether a smart contract call should be made for an inbound
+          transaction with assets used only in protocol contract version 2

This adjustment improves readability and aligns more closely with standard OpenAPI documentation practices.

pkg/contracts/testdappv2/bindings.go (1)

1-1: Approve the EVM version specification and suggest pinning the compiler version.

The addition of --evm-version london is a prudent change, ensuring compatibility with the London hard fork features. This explicit version specification aligns with best practices in Solidity development.

To further enhance reproducibility and consistency across different environments, consider pinning the Solidity compiler version as well.

Modify the go:generate directive as follows:

-//go:generate sh -c "solc TestDAppV2.sol --evm-version london --combined-json abi,bin | jq '.contracts.\"TestDAppV2.sol:TestDAppV2\"'  > TestDAppV2.json"
+//go:generate sh -c "solc TestDAppV2.sol --evm-version london --combined-json abi,bin --version 0.8.18 | jq '.contracts.\"TestDAppV2.sol:TestDAppV2\"'  > TestDAppV2.json"

This change ensures that the contract is always compiled with a specific Solidity version, reducing the risk of unexpected behavior due to compiler differences.

e2e/e2etests/test_v2_erc20_deposit_and_call.go (1)

Line range hint 1-52: Enhance error handling and consistency in the test function.

While the function generally follows good practices, there are a few areas for improvement:

  1. Error Handling: Some method calls that can return errors are not checked. For instance, the V2ERC20DepositAndCall call.

  2. Magic Numbers: The OnRevertGasLimit is set to 0 directly. Consider using a named constant for better readability and maintainability.

  3. Consistency: The function mixes direct error checks and the use of r. for assertions. Strive for consistency in error handling throughout the function.

Consider applying these improvements:

  1. Add error checking:
tx, err := r.V2ERC20DepositAndCall(
    r.TestDAppV2ZEVMAddr,
    amount,
    []byte(payloadMessageDepositERC20),
    gatewayevm.RevertOptions{OnRevertGasLimit: big.NewInt(0)},
)
require.NoError(r, err)
  1. Use a named constant:
const defaultOnRevertGasLimit = 0

// ...

gatewayevm.RevertOptions{OnRevertGasLimit: big.NewInt(defaultOnRevertGasLimit)},
  1. Consistently use r. for assertions:
r.Require().NoError(err)
r.Require().True(ok, "Invalid amount specified for TestV2ERC20DepositAndCall")
// Apply this pattern throughout the function

These changes will improve the robustness and readability of the test function.

e2e/e2etests/test_v2_eth_deposit_and_call_no_message.go (4)

15-22: Consider enhancing error messages for improved debugging.

The initial setup of the function is well-structured. However, to facilitate easier debugging, consider providing more descriptive error messages. For instance:

require.Len(r, args, 1, "TestV2ETHDepositAndCallNoMessage requires exactly one argument for the deposit amount")

amount, ok := big.NewInt(0).SetString(args[0], 10)
require.True(r, ok, "Invalid amount specified for TestV2ETHDepositAndCallNoMessage: %s", args[0])

This change would provide more context in case of failures, aiding in quicker issue resolution.


24-30: Document the rationale for RevertOptions configuration.

The deposit and call execution is implemented correctly. However, the reasoning behind setting OnRevertGasLimit to 0 in the RevertOptions is not immediately clear. Consider adding a comment explaining this choice:

// perform the deposit and call to the TestDAppV2ZEVMAddr
tx := r.V2ETHDepositAndCall(
    r.TestDAppV2ZEVMAddr,
    amount,
    []byte{},
    gatewayevm.RevertOptions{
        // OnRevertGasLimit is set to 0 to [explain the reason, e.g., "disable custom gas limit on revert"]
        OnRevertGasLimit: big.NewInt(0),
    },
)

This documentation would clarify the intent and help maintain the code in the future.


37-40: Enhance error handling for GetNoMessageIndex call.

The payload reception check is implemented correctly. However, to improve robustness, consider adding more context to the error returned by GetNoMessageIndex. This can be achieved by wrapping the error:

messageIndex, err := r.TestDAppV2ZEVM.GetNoMessageIndex(&bind.CallOpts{}, r.EVMAddress())
if err != nil {
    return fmt.Errorf("failed to get NoMessageIndex: %w", err)
}

This change would provide more context in case of failures, aiding in quicker issue resolution.


42-46: Enhance assertion message for balance check.

The balance update check is implemented correctly. To improve debugging in case of a failure, consider providing more context in the assertion message:

newBalance, err := r.ETHZRC20.BalanceOf(&bind.CallOpts{}, r.TestDAppV2ZEVMAddr)
require.NoError(r, err)
expectedBalance := new(big.Int).Add(oldBalance, amount)
require.Equal(r, expectedBalance, newBalance, "New balance (%s) does not match expected balance (%s)", newBalance, expectedBalance)

This change would provide more detailed information about the actual and expected balances in case of a mismatch.

x/crosschain/types/inbound_parsing_test.go (3)

13-15: Consider setting a timeline for completing the TODO items.

While TODO comments are generally discouraged in production code, they can be acceptable in test files if properly tracked. However, it would be beneficial to set a timeline for addressing these incomplete tests to ensure comprehensive test coverage.


32-49: Expand test coverage for NewWithdrawalInbound.

The current test case for NewWithdrawalInbound is well-structured and correctly validates the error condition for an invalid chain ID. However, to ensure comprehensive coverage, consider adding the following test cases:

  1. A successful case with valid inputs.
  2. Edge cases for various input parameters (e.g., zero or negative amounts).
  3. Tests for different chain IDs and their corresponding behaviors.

Expanding the test suite will provide better confidence in the function's correctness across various scenarios.


51-68: Expand test coverage and consider refactoring for NewCallInbound.

The current test case for NewCallInbound is well-structured and correctly validates the error condition for an invalid chain ID. However, to improve the test suite:

  1. Add more test cases:

    • A successful case with valid inputs.
    • Edge cases for various input parameters.
    • Tests for different chain IDs and their corresponding behaviors.
  2. Consider refactoring the common setup code for TestNewWithdrawalInbound and TestNewCallInbound into a helper function to reduce duplication and improve maintainability.

Example refactor:

func setupInvalidChainIDTest(t *testing.T) (types.Context, string) {
    _, ctx, _, _ := keepertest.CrosschainKeeper(t)
    ctx = ctx.WithChainID("invalidChainID")
    return ctx, sample.EthAddress().Hex()
}

// Use in both test functions
ctx, sampleAddress := setupInvalidChainIDTest(t)

This refactoring will make the tests more concise and easier to maintain.

zetaclient/chains/evm/cctx.go (1)

65-68: Consistent logic applied to ERC20 transactions.

The changes for ERC20 transactions mirror those made for gas transactions, maintaining consistency in the codebase. This parallel structure enhances readability and addresses the PR objectives for both transaction types.

Consider refactoring the common logic for both CoinType_Gas and CoinType_ERC20 cases to reduce code duplication and improve maintainability. For example:

func determineOutboundType(isCrossChainCall bool, baseType, andCallType OutboundType) OutboundType {
    if isCrossChainCall {
        return andCallType
    }
    return baseType
}

// Usage in ParseOutboundTypeFromCCTX:
case coin.CoinType_Gas:
    return determineOutboundType(cctx.InboundParams.IsCrossChainCall, OutboundTypeGasWithdraw, OutboundTypeGasWithdrawAndCall)
case coin.CoinType_ERC20:
    return determineOutboundType(cctx.InboundParams.IsCrossChainCall, OutboundTypeERC20Withdraw, OutboundTypeERC20WithdrawAndCall)

This refactoring would centralize the logic and make future modifications easier.

zetaclient/chains/evm/cctx_test.go (1)

13-96: Comprehensive test coverage with minor improvements needed.

The test cases cover a wide range of scenarios, including different coin types, cross-chain calls, and revert conditions. This comprehensive approach ensures robust testing of the ParseOutboundTypeFromCCTX function.

However, there are two minor points for improvement:

  1. There's a typo in the test case name on line 85. "Uuknown" should be "Unknown".

  2. The test case for the ZETA coin type (lines 85-95) could be more explicit about why it results in an unknown outbound type. Consider adding a comment explaining this behavior or renaming the test case to better reflect the expected outcome.

Please apply the following changes:

-			name: "ZETA gives Uuknown outbound type",
+			name: "ZETA results in Unknown outbound type",

Also, consider adding a comment explaining why ZETA results in an unknown outbound type, if this is the intended behavior.

zetaclient/chains/evm/constant.go (1)

50-52: Approve the addition of TopicsGatewayDepositAndCall constant.

The new constant TopicsGatewayDepositAndCall is well-defined and consistent with the existing codebase. It enhances the system's capability to handle gateway deposit and call events.

For improved consistency, consider adding a reference to the relevant smart contract file and line number in the comment, similar to other constants in this file.

 // TopicsGatewayDepositAndCall is the number of topics for a gateway deposit and call event
 // [signature, sender, receiver]
+// https://github.com/zeta-chain/protocol-contracts/blob/main/contracts/evm/ZetaGateway.sol#L<LINE_NUMBER>
 TopicsGatewayDepositAndCall = 3
cmd/zetae2e/local/v2.go (2)

29-30: Approve addition of new test cases with a minor suggestion.

The inclusion of TestV2ETHDepositAndCallNoMessageName and TestV2ETHWithdrawAndCallNoMessageName aligns with the PR objectives and enhances test coverage for empty message scenarios.

To improve clarity, consider adding a comment above these new test cases to explicitly state their purpose:

// Test cases for deposit and withdraw with empty messages
e2etests.TestV2ETHDepositAndCallNoMessageName,
e2etests.TestV2ETHWithdrawAndCallNoMessageName,

This addition would enhance code readability and maintainability.


41-41: Approve addition of new test case with a suggestion for completeness.

The inclusion of TestV2ERC20DepositAndCallNoMessageName is appropriate and aligns with the PR objectives. However, for consistency with the ETH workflow, consider adding a corresponding test case for ERC20 withdrawal with an empty message:

e2etests.TestV2ERC20DepositAndCallNoMessageName,
e2etests.TestV2ERC20WithdrawAndCallNoMessageName,

This addition would ensure comprehensive coverage of both deposit and withdrawal scenarios for ERC20 tokens with empty messages, maintaining parity with the ETH workflow testing.

x/crosschain/types/message_vote_inbound.go (2)

89-89: Appropriate initialization of the new field.

The IsCrossChainCall field is correctly initialized to false, maintaining backward compatibility. To enhance code clarity, consider using a named constant for the default value:

const DefaultIsCrossChainCall = false

// In NewMsgVoteInbound
IsCrossChainCall: DefaultIsCrossChainCall,

This approach would improve readability and make it easier to update the default value if needed in the future.


Serialization Implications Identified for MsgVoteInbound

The IsCrossChainCall field has been added to the MsgVoteInbound struct; however, it is not reflected in the protobuf definitions or JSON marshaling. This omission can lead to serialization inconsistencies and potential runtime errors.

  • Update Protobuf Definitions: Ensure that the IsCrossChainCall field is included in all relevant .proto files.
  • Review JSON Marshaling: Verify and update JSON struct tags to incorporate the new field appropriately.
🔗 Analysis chain

Line range hint 41-89: Consider additional validations and serialization implications.

The introduction of the IsCrossChainCall field and its associated option function are well-implemented. However, there are two points to consider:

  1. The ValidateBasic method hasn't been updated to include validation for the new field. Consider whether any validation is necessary for this field.

  2. The addition of a new field may have implications for serialization and deserialization, especially if this struct is used in network communications or persistent storage. Ensure that all serialization mechanisms (e.g., protobuf definitions, JSON marshaling) are updated accordingly.

To verify the serialization implications, you may want to run the following command:

This will help identify areas where serialization might need to be updated.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for protobuf definitions and JSON marshaling of MsgVoteInbound
rg -A 10 "MsgVoteInbound" | rg "(proto|json)"

Length of output: 11322

proto/zetachain/zetacore/crosschain/cross_chain_tx.proto (1)

46-49: Approve the addition of is_cross_chain_call field with suggestions for improvement.

The new field is_cross_chain_call is a suitable addition to support the PR objectives. However, consider the following recommendations:

  1. Enhance the comment for clarity:
// Indicates whether a smart contract call should be made for an inbound transaction.
// This field is specifically used for assets in protocol contract version 2.
bool is_cross_chain_call = 12;
  1. As per the past review comment, this field might be subject to future changes. Consider adding a TODO comment to track this:
// TODO: This field may be removed or generalized for all inbound transactions
// in the future. Track progress at https://github.com/zeta-chain/node/issues/1949
  1. Ensure backwards compatibility is maintained when implementing logic related to this field.
x/crosschain/keeper/evm_deposit.go (1)

113-113: Approve the addition of IsCrossChainCall parameter with a suggestion for clarity.

The addition of cctx.InboundParams.IsCrossChainCall as a parameter to ZRC20DepositAndCallContract is appropriate and aligns with the PR objectives. This change enables the differentiation between standard deposits/withdrawals and those utilizing depositAndCall/withdrawAndCall functionalities.

To enhance code clarity, consider adding a brief comment explaining the purpose of this parameter:

// IsCrossChainCall indicates whether this is a cross-chain call (depositAndCall/withdrawAndCall)
cctx.InboundParams.IsCrossChainCall,

This addition will provide context for future developers working on this code.

pkg/contracts/testdappv2/TestDAppV2.abi (1)

127-145: Approval: getNoMessageIndex function addition is appropriate.

The new getNoMessageIndex function aligns with the PR objectives by providing a mechanism to retrieve information about no-message calls for a specific address. The function signature and "pure" stateMutability are consistent with Solidity best practices.

Consider adding inline documentation to clarify the purpose and expected return value of this function. For example:

/**
 * @dev Retrieves the index associated with no-message calls for a given address.
 * @param sender The address to query.
 * @return A string representing the no-message index for the given address.
 */
function getNoMessageIndex(address sender) external pure returns (string memory);
e2e/runner/v2_zevm.go (3)

Line range hint 79-102: Approve changes with minor suggestion for consistency.

The implementation of V2ETHWithdrawAndCallThroughContract is well-structured and consistent with the overall design. It correctly uses the GatewayZEVMCaller for contract interaction.

For improved consistency with other functions in this file, consider adding a comment explaining the gas limit usage:

// This function may require more gas than the default limit
previousGasLimit := r.ZEVMAuth.GasLimit
r.ZEVMAuth.GasLimit = 10000000
defer func() {
    r.ZEVMAuth.GasLimit = previousGasLimit
}()

This change would align the gas handling with other functions like V2ERC20WithdrawAndCall.


Line range hint 123-152: Approve changes with suggestion for improved clarity.

The renaming of V2ERC20WithdrawAndArbitraryCall and its implementation are appropriate. The function correctly handles the increased gas limit requirement.

To enhance code clarity, consider extracting the gas limit value to a named constant:

const highGasLimit = 10000000

// Usage
r.ZEVMAuth.GasLimit = highGasLimit

This change would improve readability and make it easier to update the gas limit if needed in the future.


Line range hint 222-245: Approve changes with suggestion for consistency.

The implementation of V2ZEVMToEMVCallThroughContract is well-structured and correctly uses the GatewayZEVMCaller for contract interaction.

For consistency with other functions like V2ETHWithdrawAndCallThroughContract, consider adding a comment explaining the purpose of this function:

// V2ZEVMToEMVCallThroughContract calls authenticated Call of Gateway on ZEVM through contract
// This function facilitates cross-chain calls from ZEVM to EVM-compatible chains

This addition would provide context and improve the overall documentation of the codebase.

proto/zetachain/zetacore/crosschain/tx.proto (1)

181-183: Approve addition of is_cross_chain_call field with suggestion for improved documentation.

The addition of the is_cross_chain_call boolean field to the MsgVoteInbound message is appropriate and follows Protobuf best practices. This enhancement allows for clear indication of whether a smart contract call should be made with the asset, which is valuable for cross-chain operations.

To further improve the code, consider adding a comment that provides more context about when this field should be set to true and its implications on the system's behavior.

Consider adding a descriptive comment above the field, such as:

// Indicates whether a smart contract call should be made with the asset.
// Set to true for cross-chain contract calls, false for standard transfers.
bool is_cross_chain_call = 19;
x/fungible/keeper/v2_deposits_test.go (5)

18-50: Approve implementation with minor enhancement suggestion.

The getTestDAppNoMessageIndex function is well-structured and follows best practices for error handling and type assertion. To further enhance its robustness, consider adding a timeout mechanism to the CallEVM function call to prevent potential blocking issues in case of network delays or contract execution problems.


141-152: Approve test case with suggestion for additional assertions.

The test case effectively covers the basic functionality of processing a deposit without a contract call. To enhance its comprehensiveness, consider adding assertions to verify:

  1. The state of other relevant contract variables or events that might be affected by the deposit.
  2. The gas consumption of the operation to ensure it remains within expected limits.

These additional checks would provide a more thorough validation of the deposit process.


Line range hint 154-186: Enhance test case to verify message ignorance.

While the test case correctly verifies the deposit process with a non-empty message, it could be strengthened by adding explicit checks to ensure the message is truly ignored. Consider the following enhancements:

  1. Add an assertion to verify that no event related to message processing is emitted.
  2. If applicable, check that any contract state that might be affected by message processing remains unchanged.
  3. Compare the gas consumption with the previous test case to ensure it's consistent, indicating that no additional processing occurred due to the presence of the message.

These additions would provide stronger evidence that the message is indeed ignored in this scenario.


Line range hint 188-222: Enhance test coverage for deposit and call scenario.

The test case effectively covers the basic flow of processing a deposit with a contract call. To improve its robustness and coverage, consider the following enhancements:

  1. Add assertions to verify the emitted events, ensuring they contain the correct information about the deposit and contract call.
  2. Include negative test cases, such as:
    a. Attempting a deposit with insufficient balance.
    b. Calling a non-existent contract method.
    c. Passing invalid parameters to the contract call.
  3. Verify the gas consumption of the operation to ensure it's within expected limits for a contract call scenario.
  4. Add a test case with a large deposit amount to check for potential overflow issues.

These additions would provide a more comprehensive test suite for the deposit and call functionality.


224-270: Approve new test case with suggestions for enhancement.

The test case effectively covers the new scenario of processing a deposit and call without a message, aligning well with the PR objectives. The use of getTestDAppNoMessageIndex and subsequent verification of the contract state are appropriate. To further strengthen this test, consider the following enhancements:

  1. Add assertions to verify that the correct events are emitted, including the absence of a message-related event.
  2. Include a check to ensure that the messageIndex is unique for each call, preventing potential conflicts.
  3. Add a negative test case where isCrossChainCall is set to false, to ensure the no-message index is not generated in this scenario.
  4. Verify the gas consumption difference between this case and the case with a message, to ensure efficiency in handling no-message calls.

These additions would provide a more comprehensive validation of the new functionality.

docs/spec/crosschain/messages.md (2)

194-194: Add description for the new field and improve formatting.

The addition of the is_cross_chain_call field enhances the functionality for cross-chain calls, aligning with the PR objectives. However, to improve clarity and maintainability, consider the following suggestions:

  1. Add a brief description of the is_cross_chain_call field, explaining its purpose and usage.
  2. For consistency with the rest of the document, replace the hard tab with spaces.

Here's a suggested improvement:

-	bool is_cross_chain_call = 19;
+    bool is_cross_chain_call = 19; // Indicates whether this is a cross-chain call (e.g., depositAndCall or withdrawAndCall)
🧰 Tools
🪛 Markdownlint

194-194: Column: 1
Hard tabs

(MD010, no-hard-tabs)


194-194: Update surrounding documentation to provide context for the new field.

While the addition of the is_cross_chain_call field is appropriate, the surrounding documentation lacks context for this new functionality. To enhance clarity and maintainability, consider updating the documentation to:

  1. Explain the purpose of the is_cross_chain_call field in the context of depositAndCall and withdrawAndCall operations.
  2. Describe how this field affects the processing of inbound votes, especially when messages are empty.
  3. Provide an example or use case to illustrate when this field would be set to true.

Here's a suggested addition to the documentation above the MsgVoteInbound definition:

The `MsgVoteInbound` message now supports differentiation between standard deposits/withdrawals and cross-chain calls (e.g., `depositAndCall` and `withdrawAndCall`), even when the message field is empty. This is achieved through the `is_cross_chain_call` field.
🧰 Tools
🪛 Markdownlint

194-194: Column: 1
Hard tabs

(MD010, no-hard-tabs)

x/crosschain/types/cctx.go (1)

Line range hint 1-340: Suggest comprehensive implementation of the new feature

While the addition of the IsCrossChainCall field is a step in the right direction, the implementation appears incomplete. Consider the following suggestions to fully integrate this new feature:

  1. Update the Validate() method of the CrossChainTx struct to include validation for the new field.
  2. Modify relevant methods such as AddRevertOutbound(), AddOutbound(), and others to utilize the IsCrossChainCall information where appropriate.
  3. Add unit tests to cover the new functionality and ensure proper handling of cross-chain calls.
  4. Update documentation throughout the file to reflect the new cross-chain call functionality.

Implementing these suggestions will ensure a more robust and complete integration of the new feature.

Would you like assistance in generating the code for these improvements?

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 240-240: x/crosschain/types/cctx.go#L240
Added line #L240 was not covered by tests

x/crosschain/types/message_vote_inbound_test.go (1)

188-251: Approve the new test case with a minor suggestion.

The new test case effectively verifies the functionality of setting cross-chain call options in the MsgVoteInbound message. It covers all scenarios: default value, setting to true, and setting to false.

Consider renaming the test case to be more specific:

-t.Run("can set is cross chain call options", func(t *testing.T) {
+t.Run("verify cross chain call options default and setting", func(t *testing.T) {

This name more accurately describes the test's purpose and aligns with best practices for test naming.

x/fungible/keeper/deposits_test.go (7)

48-48: Approve changes with minor suggestion for clarity

The addition of the false parameter is correct and consistent with the updated method signature. However, to enhance code readability, consider using a named parameter:

isCrossChainCall: false,

This change would make the purpose of the boolean value more explicit to readers.


82-82: Approve changes with suggestion for consistency

The addition of the false parameter is correct. For consistency with the previous suggestion and to improve code clarity, consider using a named parameter:

isCrossChainCall: false,

This change would maintain a uniform style across all test cases.


116-116: Approve changes with suggestion for consistency

The addition of the false parameter is correct. To maintain consistency with previous suggestions and enhance code readability, consider using a named parameter:

isCrossChainCall: false,

This change would ensure a uniform style across all test cases and improve overall code clarity.


159-159: Approve changes with suggestion for consistency

The addition of the false parameter is correct. To maintain consistency with previous suggestions and improve code clarity, consider using a named parameter:

isCrossChainCall: false,

This change would ensure a uniform style across all test cases and enhance overall readability.


198-198: Approve changes with suggestion for consistency

The addition of the false parameter is correct. To maintain consistency with previous suggestions and enhance code clarity, consider using a named parameter:

isCrossChainCall: false,

This change would ensure a uniform style across all test cases and improve overall readability of the test suite.


241-241: Approve changes with suggestion for consistency

The addition of the false parameter is correct. To maintain consistency with previous suggestions and improve code clarity, consider using a named parameter:

isCrossChainCall: false,

This change would ensure a uniform style across all test cases and enhance the overall readability of the test suite.


269-269: Approve changes with suggestion for consistency

The addition of the false parameter is correct. To maintain consistency with previous suggestions and enhance code clarity, consider using a named parameter:

isCrossChainCall: false,

This change would ensure a uniform style across all test cases and improve the overall readability of the test suite.

testutil/keeper/crosschain.go (2)

Line range hint 393-401: Approve addition with minor enhancement suggestion.

The MockRevertForHandleEVMDeposit function effectively simulates a failed deposit operation. Consider adding a comment explaining the purpose of this mock function for improved code documentation.

+// MockRevertForHandleEVMDeposit simulates a failed ZRC20 deposit operation for testing purposes
 func MockRevertForHandleEVMDeposit(
     m *crosschainmocks.CrosschainFungibleKeeper,
     receiver ethcommon.Address,
     amount *big.Int,
     senderChainID int64,
     errDeposit error,
 ) {

Line range hint 413-421: Approve changes to MockVoteOnOutboundFailedBallot with refactoring suggestion.

The modifications to MockVoteOnOutboundFailedBallot mirror those made to MockVoteOnOutboundSuccessBallot, enhancing testing flexibility. Consider refactoring these two functions to reduce code duplication, as they share similar structures and differ primarily in the ReceiveStatus parameter.

Example refactoring:

func mockVoteOnOutboundBallot(
    m *crosschainmocks.CrosschainObserverKeeper,
    ctx sdk.Context,
    cctx *types.CrossChainTx,
    senderChain chains.Chain,
    observer string,
    status chains.ReceiveStatus,
    ballotStatus observertypes.BallotStatus,
) {
    m.On("VoteOnOutboundBallot", ctx, mock.Anything, cctx.GetCurrentOutboundParam().ReceiverChainId, status, observer).
        Return(true, true, observertypes.Ballot{BallotStatus: ballotStatus}, senderChain.Name, nil).
        Once()
}

// Then use it like this:
func MockVoteOnOutboundSuccessBallot(...) {
    mockVoteOnOutboundBallot(..., chains.ReceiveStatus_success, observertypes.BallotStatus_BallotFinalized_SuccessObservation)
}

func MockVoteOnOutboundFailedBallot(...) {
    mockVoteOnOutboundBallot(..., chains.ReceiveStatus_failed, observertypes.BallotStatus_BallotFinalized_FailureObservation)
}
pkg/contracts/testdappv2/TestDAppV2.json (3)

3-15: Approve addition of NO_MESSAGE_CALL function

The new NO_MESSAGE_CALL function aligns with the PR objective of supporting depositAndCall and withdrawAndCall with empty messages. Its view state mutability ensures it doesn't modify the contract state.

Consider adding a NatSpec comment to document the purpose and return value of this function for improved clarity and maintainability.


128-146: Approve addition of getNoMessageIndex function

The new getNoMessageIndex function complements the NO_MESSAGE_CALL function in handling empty message scenarios. Its pure state mutability ensures it doesn't read or modify the contract state.

Consider adding a NatSpec comment to document the purpose, parameter, and return value of this function for improved clarity and maintainability.


Implement Comprehensive Tests for New Functions

The newly added NO_MESSAGE_CALL and getNoMessageIndex functions lack corresponding test cases. To ensure their correct integration and functionality, it is essential to develop dedicated tests covering various scenarios, including edge cases and interactions with existing functions like depositAndCall and withdrawAndCall.

  • Develop test cases for NO_MESSAGE_CALL and getNoMessageIndex.
  • Ensure integration tests validate their behavior within depositAndCall and withdrawAndCall operations.
  • Cover edge cases such as empty messages and incorrect inputs to verify robustness.
🔗 Analysis chain

Line range hint 1-295: Approve contract modifications and suggest comprehensive testing

The additions of NO_MESSAGE_CALL and getNoMessageIndex functions enhance the contract's capability to handle empty message scenarios, aligning with the PR objectives. These view and pure functions maintain the contract's overall behavior while extending its functionality.

Ensure comprehensive testing of the new functions and their integration with existing functionality, particularly in scenarios involving depositAndCall and withdrawAndCall with empty messages. Consider the following verification steps:

  1. Test NO_MESSAGE_CALL in various contexts.
  2. Verify getNoMessageIndex with different sender addresses.
  3. Integrate these functions with depositAndCall and withdrawAndCall operations.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify the integration of new functions with existing functionality

# Search for test files related to depositAndCall and withdrawAndCall
echo "Searching for relevant test files:"
fd -e js -e ts -e sol --exec grep -Hn 'depositAndCall|withdrawAndCall|NO_MESSAGE_CALL|getNoMessageIndex' {}

# Look for any TODOs or FIXMEs related to empty message handling
echo "Checking for TODOs or FIXMEs related to empty message handling:"
rg -i 'TODO|FIXME' -A 3 -B 3 | rg -i 'empty.?message|no.?message'

Length of output: 395


Script:

#!/bin/bash
# Broadening the search for test cases related to new functions

# Search for any test files that mention the new functions
echo "Searching for test cases covering NO_MESSAGE_CALL and getNoMessageIndex:"
fd -e js -e ts -e sol -g '*test*.js' --exec grep -Hn 'NO_MESSAGE_CALL\|getNoMessageIndex' {} \;

# Search for tests related to depositAndCall and withdrawAndCall with empty messages
echo "Searching for tests related to depositAndCall and withdrawAndCall handling empty messages:"
fd -e js -e ts -e sol -g '*test*.js' --exec grep -i -Hn 'depositAndCall.*empty message\|withdrawAndCall.*empty message' {} \;

# Verify if there are any generic tests handling empty messages
echo "Searching for generic tests handling empty messages:"
fd -e js -e ts -e sol -g '*test*.js' --exec grep -i -Hn 'empty message\|no message\|handle empty' {} \;

Length of output: 801


Script:

#!/bin/bash
# Expanding the search for test cases related to new functions

# Search for test files with various naming conventions and extensions
echo "Searching for test cases covering NO_MESSAGE_CALL and getNoMessageIndex with broader patterns:"
fd -e js -e ts -e sol -e jsx -e tsx -e py -g '*test*' --exec grep -Hn 'NO_MESSAGE_CALL\|getNoMessageIndex' {} \;

# Search for any usage of the new functions within the codebase
echo "Searching for any usage of NO_MESSAGE_CALL and getNoMessageIndex in the codebase:"
rg -i 'NO_MESSAGE_CALL|getNoMessageIndex'

# Use ast-grep to find implementations or references of the new functions
echo "Using ast-grep to locate implementations of NO_MESSAGE_CALL and getNoMessageIndex:"
ast-grep --pattern 'function NO_MESSAGE_CALL($_) { $$$ }' .
ast-grep --pattern 'function getNoMessageIndex($_) { $$$ }' .

Length of output: 9146

go.mod (1)

Assess Maintenance of Forked Dependencies

  • github.com/bnb-chain/tss-lib last updated on 2024-01-26
  • github.com/ethereum/go-ethereum last updated on 2024-07-18
  • github.com/libp2p/go-libp2p last updated on 2024-07-30
  • gitlab.com/thorchain/tss/go-tss last updated on 2024-09-19

The tss-lib dependency has not been updated since January 2024, which may lead to discrepancies with upstream changes and potential security vulnerabilities. It is recommended to review the maintenance status of this fork and ensure it aligns with project requirements.

🔗 Analysis chain

Line range hint 392-399: Verify maintenance of forked dependencies.

Several dependencies are being replaced with forks maintained by ZetaChain:

  • github.com/bnb-chain/tss-lib
  • github.com/ethereum/go-ethereum
  • github.com/libp2p/go-libp2p
  • gitlab.com/thorchain/tss/go-tss

While using forks allows for custom modifications, it's crucial to ensure these forks are regularly updated to incorporate upstream changes and security patches.

To verify the last update times of these forks, please run the following script:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check the last commit dates of the ZetaChain forks.

echo "Checking last commit dates of ZetaChain forks:"
for repo in "tss-lib" "go-ethereum" "go-libp2p" "go-tss"; do
    echo "$repo:"
    gh repo view zeta-chain/$repo --json updatedAt --jq .updatedAt
    echo
done

Length of output: 837

x/crosschain/keeper/evm_deposit_test.go (2)

Line range hint 102-110: LGTM. Consider adding a comment for the new parameter.

The addition of the new mock.Anything parameter aligns with the PR objectives. To enhance code readability, consider adding a comment explaining the purpose of this new parameter.


Line range hint 556-564: LGTM. Consider updating the comment for consistency.

The changes to this test case are consistent with the previous modifications. For improved consistency, consider updating the comment above the ZRC20DepositAndCallContract mock function call to reflect the new parameter.

testutil/keeper/mocks/crosschain/fungible.go (1)

Line range hint 700-734: Approve changes with a minor suggestion for improved readability.

The implementation of ZRC20DepositAndCallContract correctly incorporates the new isCrossChainCall parameter, aligning with the PR objectives. The changes are well-structured and consistent with the existing codebase.

To enhance readability, consider breaking down the long parameter list using line breaks and alignment:

func (_m *CrosschainFungibleKeeper) ZRC20DepositAndCallContract(
    ctx types.Context,
    from []byte,
    to common.Address,
    amount *big.Int,
    senderChainID int64,
    data []byte,
    coinType coin.CoinType,
    asset string,
    protocolContractVersion crosschaintypes.ProtocolContractVersion,
    isCrossChainCall bool,
) (*evmtypes.MsgEthereumTxResponse, bool, error) {
    // ... rest of the implementation
}

This formatting improves code readability without changing functionality.

e2e/e2etests/e2etests.go (1)

786-793: Consistent addition of new E2ETests for V2 withdrawals with no message.

The new E2ETests for V2 ETH and ERC20 withdrawal and call with no message content are well-structured and maintain consistency with existing tests. The descriptions accurately reflect their purposes.

However, for improved consistency:

Consider adding a default amount for the ERC20 withdrawal test, similar to the ETH withdrawal test:

 runner.NewE2ETest(
 	TestV2ERC20WithdrawAndCallNoMessageName,
 	"withdraw ERC20 from ZEVM and authenticated call a contract using V2 contract with no message",
-	[]runner.ArgDefinition{},
+	[]runner.ArgDefinition{
+		{Description: "amount", DefaultValue: "1000"},
+	},
 	TestV2ERC20WithdrawAndCallNoMessage,
 ),

Also applies to: 880-885

testutil/sample/crosschain.go (1)

317-318: Approve renaming of GetValidZRC20WithdrawToETH with a minor suggestion.

The renaming of GetValidZRC20WithdrawToETH to ValidZrc20WithdrawToETHReceipt improves code clarity and maintains consistency with other function names. However, there's a minor inconsistency in the capitalization of "Zrc20".

Consider updating the function name to ValidZRC20WithdrawToETHReceipt for consistent capitalization of "ZRC20".

changelog.md (1)

57-57: Consider renaming event names for consistency

The event names DepositedAndCalled and WithdrawedAndCalled are grammatically inconsistent. Consider renaming WithdrawedAndCalled to WithdrawnAndCalled for better grammatical consistency and clarity.

x/fungible/keeper/v2_deposits.go (1)

31-31: Clarify the initialization of Origin to an empty byte slice

Setting context.Origin to []byte{} may benefit from an explanatory comment. If this is intentional to reflect a specific context where the origin is undefined or irrelevant, documenting the rationale will enhance code readability and assist future developers.

x/crosschain/types/inbound_parsing.go (2)

104-107: Nitpick: Document the parameters and error cases

The inbound message constructor functions lack detailed documentation for their parameters and potential error cases. Providing comprehensive comments improves code readability and maintainability.

Enhance the function comments to include descriptions of each parameter and the conditions under which errors are returned. For example:

// NewWithdrawalInbound creates a new inbound message for a withdrawal.
//
// Parameters:
// - ctx: The context of the operation.
// - txOrigin: The original transaction sender.
// - foreignCoin: The foreign coin details.
// - event: The parsed withdrawal event.
// - receiverChain: The chain where the funds are received.
// - gasLimitQueried: The queried gas limit if not specified in the event.
//
// Returns:
// - A pointer to MsgVoteInbound if successful.
// - An error if any parameter is invalid or an operation fails.

Also applies to: 159-162, 207-210


3-18: Nitpick: Organize imports for clarity

The import statements can be organized into standard, third-party, and local packages to improve readability.

Group the imports as follows:

import (
	"encoding/hex"
	"math/big"

	sdkmath "cosmossdk.io/math"
	sdk "github.com/cosmos/cosmos-sdk/types"
	"github.com/pkg/errors"

	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	ethcommon "github.com/ethereum/go-ethereum/common"
	ethtypes "github.com/ethereum/go-ethereum/core/types"

	"github.com/zeta-chain/node/pkg/chains"
	"github.com/zeta-chain/node/pkg/coin"
	fungibletypes "github.com/zeta-chain/node/x/fungible/types"
	"github.com/zeta-chain/protocol-contracts/v2/pkg/gatewayzevm.sol"
)
pkg/contracts/testdappv2/TestDAppV2.go (1)

225-240: Consider handling potential errors more gracefully

In the implementations of NOMESSAGECALL and GetNoMessageIndex, any errors returned from the contract call are directly returned. Evaluate the necessity of additional error handling or custom error messages to provide clearer insights during failures.

Also applies to: 380-395

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 228-234: pkg/contracts/testdappv2/TestDAppV2.go#L228-L234
Added lines #L228 - L234 were not covered by tests


[warning] 236-238: pkg/contracts/testdappv2/TestDAppV2.go#L236-L238
Added lines #L236 - L238 were not covered by tests

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 9347165 and 1ebd9a5.

⛔ Files ignored due to path filters (6)
  • go.sum is excluded by !**/*.sum
  • pkg/contracts/testdappv2/TestDAppV2.bin is excluded by !**/*.bin
  • typescript/zetachain/zetacore/crosschain/cross_chain_tx_pb.d.ts is excluded by !**/*_pb.d.ts
  • typescript/zetachain/zetacore/crosschain/tx_pb.d.ts is excluded by !**/*_pb.d.ts
  • x/crosschain/types/cross_chain_tx.pb.go is excluded by !**/*.pb.go, !**/*.pb.go
  • x/crosschain/types/tx.pb.go is excluded by !**/*.pb.go, !**/*.pb.go
📒 Files selected for processing (43)
  • changelog.md (1 hunks)
  • cmd/zetae2e/local/v2.go (2 hunks)
  • docs/openapi/openapi.swagger.yaml (1 hunks)
  • docs/spec/crosschain/messages.md (1 hunks)
  • e2e/e2etests/e2etests.go (5 hunks)
  • e2e/e2etests/test_v2_erc20_deposit_and_call.go (1 hunks)
  • e2e/e2etests/test_v2_erc20_deposit_and_call_no_message.go (1 hunks)
  • e2e/e2etests/test_v2_erc20_deposit_and_call_revert.go (1 hunks)
  • e2e/e2etests/test_v2_erc20_deposit_and_call_revert_with_call.go (1 hunks)
  • e2e/e2etests/test_v2_erc20_withdraw_and_call_no_message.go (1 hunks)
  • e2e/e2etests/test_v2_eth_deposit_and_call_no_message.go (1 hunks)
  • e2e/e2etests/test_v2_eth_withdraw_and_call_no_message.go (1 hunks)
  • e2e/runner/v2_zevm.go (4 hunks)
  • go.mod (1 hunks)
  • pkg/contracts/testdappv2/TestDAppV2.abi (2 hunks)
  • pkg/contracts/testdappv2/TestDAppV2.go (3 hunks)
  • pkg/contracts/testdappv2/TestDAppV2.json (3 hunks)
  • pkg/contracts/testdappv2/TestDAppV2.sol (5 hunks)
  • pkg/contracts/testdappv2/bindings.go (1 hunks)
  • proto/zetachain/zetacore/crosschain/cross_chain_tx.proto (1 hunks)
  • proto/zetachain/zetacore/crosschain/tx.proto (1 hunks)
  • testutil/keeper/crosschain.go (1 hunks)
  • testutil/keeper/mocks/crosschain/fungible.go (2 hunks)
  • testutil/sample/crosschain.go (1 hunks)
  • x/crosschain/keeper/evm_deposit.go (1 hunks)
  • x/crosschain/keeper/evm_deposit_test.go (10 hunks)
  • x/crosschain/keeper/evm_hooks_test.go (34 hunks)
  • x/crosschain/keeper/v2_zevm_inbound.go (3 hunks)
  • x/crosschain/types/cctx.go (1 hunks)
  • x/crosschain/types/expected_keepers.go (1 hunks)
  • x/crosschain/types/inbound_parsing.go (1 hunks)
  • x/crosschain/types/inbound_parsing_test.go (1 hunks)
  • x/crosschain/types/message_vote_inbound.go (2 hunks)
  • x/crosschain/types/message_vote_inbound_test.go (1 hunks)
  • x/fungible/keeper/deposits.go (2 hunks)
  • x/fungible/keeper/deposits_test.go (11 hunks)
  • x/fungible/keeper/v2_deposits.go (1 hunks)
  • x/fungible/keeper/v2_deposits_test.go (4 hunks)
  • zetaclient/chains/evm/cctx.go (2 hunks)
  • zetaclient/chains/evm/cctx_test.go (1 hunks)
  • zetaclient/chains/evm/constant.go (1 hunks)
  • zetaclient/chains/evm/observer/inbound.go (2 hunks)
  • zetaclient/chains/evm/observer/v2_inbound.go (3 hunks)
✅ Files skipped from review due to trivial changes (2)
  • e2e/e2etests/test_v2_erc20_deposit_and_call_revert.go
  • e2e/e2etests/test_v2_erc20_deposit_and_call_revert_with_call.go
🧰 Additional context used
📓 Path-based instructions (34)
cmd/zetae2e/local/v2.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

e2e/e2etests/e2etests.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

e2e/e2etests/test_v2_erc20_deposit_and_call.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

e2e/e2etests/test_v2_erc20_deposit_and_call_no_message.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

e2e/e2etests/test_v2_erc20_withdraw_and_call_no_message.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

e2e/e2etests/test_v2_eth_deposit_and_call_no_message.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

e2e/e2etests/test_v2_eth_withdraw_and_call_no_message.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

e2e/runner/v2_zevm.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

pkg/contracts/testdappv2/TestDAppV2.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

pkg/contracts/testdappv2/bindings.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

proto/zetachain/zetacore/crosschain/cross_chain_tx.proto (1)

Pattern **/*.proto: Review the Protobuf definitions, point out issues relative to compatibility, and expressiveness.

proto/zetachain/zetacore/crosschain/tx.proto (1)

Pattern **/*.proto: Review the Protobuf definitions, point out issues relative to compatibility, and expressiveness.

testutil/keeper/crosschain.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

testutil/keeper/mocks/crosschain/fungible.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

testutil/sample/crosschain.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/keeper/evm_deposit.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/keeper/evm_deposit_test.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/keeper/evm_hooks_test.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/keeper/v2_zevm_inbound.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/types/cctx.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/types/expected_keepers.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/types/inbound_parsing.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/types/inbound_parsing_test.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/types/message_vote_inbound.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/crosschain/types/message_vote_inbound_test.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/fungible/keeper/deposits.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/fungible/keeper/deposits_test.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/fungible/keeper/v2_deposits.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

x/fungible/keeper/v2_deposits_test.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

zetaclient/chains/evm/cctx.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

zetaclient/chains/evm/cctx_test.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

zetaclient/chains/evm/constant.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

zetaclient/chains/evm/observer/inbound.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

zetaclient/chains/evm/observer/v2_inbound.go (1)

Pattern **/*.go: Review the Go code, point out issues relative to principles of clean code, expressiveness, and performance.

🪛 Markdownlint
docs/spec/crosschain/messages.md

194-194: Column: 1
Hard tabs

(MD010, no-hard-tabs)

🪛 GitHub Check: codecov/patch
pkg/contracts/testdappv2/TestDAppV2.go

[warning] 228-234: pkg/contracts/testdappv2/TestDAppV2.go#L228-L234
Added lines #L228 - L234 were not covered by tests


[warning] 236-238: pkg/contracts/testdappv2/TestDAppV2.go#L236-L238
Added lines #L236 - L238 were not covered by tests


[warning] 245-246: pkg/contracts/testdappv2/TestDAppV2.go#L245-L246
Added lines #L245 - L246 were not covered by tests


[warning] 252-253: pkg/contracts/testdappv2/TestDAppV2.go#L252-L253
Added lines #L252 - L253 were not covered by tests


[warning] 383-389: pkg/contracts/testdappv2/TestDAppV2.go#L383-L389
Added lines #L383 - L389 were not covered by tests


[warning] 391-393: pkg/contracts/testdappv2/TestDAppV2.go#L391-L393
Added lines #L391 - L393 were not covered by tests


[warning] 400-401: pkg/contracts/testdappv2/TestDAppV2.go#L400-L401
Added lines #L400 - L401 were not covered by tests


[warning] 407-408: pkg/contracts/testdappv2/TestDAppV2.go#L407-L408
Added lines #L407 - L408 were not covered by tests

x/crosschain/keeper/v2_zevm_inbound.go

[warning] 40-41: x/crosschain/keeper/v2_zevm_inbound.go#L40-L41
Added lines #L40 - L41 were not covered by tests


[warning] 43-49: x/crosschain/keeper/v2_zevm_inbound.go#L43-L49
Added lines #L43 - L49 were not covered by tests


[warning] 54-54: x/crosschain/keeper/v2_zevm_inbound.go#L54
Added line #L54 was not covered by tests


[warning] 61-75: x/crosschain/keeper/v2_zevm_inbound.go#L61-L75
Added lines #L61 - L75 were not covered by tests


[warning] 84-103: x/crosschain/keeper/v2_zevm_inbound.go#L84-L103
Added lines #L84 - L103 were not covered by tests


[warning] 108-115: x/crosschain/keeper/v2_zevm_inbound.go#L108-L115
Added lines #L108 - L115 were not covered by tests

x/crosschain/types/cctx.go

[warning] 240-240: x/crosschain/types/cctx.go#L240
Added line #L240 was not covered by tests

x/crosschain/types/inbound_parsing.go

[warning] 24-44: x/crosschain/types/inbound_parsing.go#L24-L44
Added lines #L24 - L44 were not covered by tests


[warning] 52-59: x/crosschain/types/inbound_parsing.go#L52-L59
Added lines #L52 - L59 were not covered by tests


[warning] 61-61: x/crosschain/types/inbound_parsing.go#L61
Added line #L61 was not covered by tests


[warning] 69-77: x/crosschain/types/inbound_parsing.go#L69-L77
Added lines #L69 - L77 were not covered by tests


[warning] 85-93: x/crosschain/types/inbound_parsing.go#L85-L93
Added lines #L85 - L93 were not covered by tests


[warning] 113-116: x/crosschain/types/inbound_parsing.go#L113-L116
Added lines #L113 - L116 were not covered by tests


[warning] 118-121: x/crosschain/types/inbound_parsing.go#L118-L121
Added lines #L118 - L121 were not covered by tests


[warning] 124-127: x/crosschain/types/inbound_parsing.go#L124-L127
Added lines #L124 - L127 were not covered by tests


[warning] 129-148: x/crosschain/types/inbound_parsing.go#L129-L148
Added lines #L129 - L148 were not covered by tests


[warning] 168-171: x/crosschain/types/inbound_parsing.go#L168-L171
Added lines #L168 - L171 were not covered by tests


[warning] 173-176: x/crosschain/types/inbound_parsing.go#L173-L176
Added lines #L173 - L176 were not covered by tests


[warning] 178-196: x/crosschain/types/inbound_parsing.go#L178-L196
Added lines #L178 - L196 were not covered by tests


[warning] 216-219: x/crosschain/types/inbound_parsing.go#L216-L219
Added lines #L216 - L219 were not covered by tests


[warning] 221-224: x/crosschain/types/inbound_parsing.go#L221-L224
Added lines #L221 - L224 were not covered by tests


[warning] 226-245: x/crosschain/types/inbound_parsing.go#L226-L245
Added lines #L226 - L245 were not covered by tests

🔇 Additional comments (64)
e2e/e2etests/test_v2_erc20_deposit_and_call.go (1)

40-40: Approve: Log message accurately reflects the operation.

The update to the log message from "deposit" to "deposit_and_call" is appropriate and aligns with the function's purpose. This change enhances clarity and accurately represents the operation being performed.

e2e/e2etests/test_v2_eth_deposit_and_call_no_message.go (1)

32-35: Transaction mining and status check implementation is robust.

The implementation for waiting on the cross-chain transaction to be mined and checking its status is well-structured. The use of WaitCctxMinedByInboundHash ensures the transaction is processed before proceeding, and the subsequent status check verifies the expected outcome. The logging of the cctx details provides valuable information for debugging purposes.

x/crosschain/types/inbound_parsing_test.go (1)

3-11: Import statements are well-organized and appropriate.

The import statements are correctly grouped and include all necessary packages for the test file.

zetaclient/chains/evm/cctx.go (1)

50-53: Improved logic for determining outbound type.

The modification enhances the determination of the outbound type for gas transactions. By utilizing the IsCrossChainCall flag, the function now explicitly differentiates between standard withdrawals and withdraw-and-call operations, regardless of the message content. This change aligns with the PR objectives and improves code clarity.

zetaclient/chains/evm/cctx_test.go (2)

3-10: Import statements are appropriate and well-organized.

The import statements are correctly structured, following Go conventions with standard library imports preceding third-party packages. All imported packages are relevant to the test file's functionality.


12-104: Test function structure adheres to best practices.

The TestParseOutboundTypeFromCCTX function employs a table-driven test approach, which is an excellent practice for comprehensive scenario testing. The use of subtests via t.Run enhances test organization and isolation. This structure facilitates easy addition of new test cases and improves test readability.

cmd/zetae2e/local/v2.go (1)

Line range hint 1-141: Summary of review for cmd/zetae2e/local/v2.go

The changes in this file effectively enhance test coverage for handling empty messages in depositAndCall and withdrawAndCall operations, aligning well with the PR objectives. The new test cases are appropriately integrated into the existing parallel execution structure and follow consistent naming conventions.

Key points:

  1. New test cases for ETH workflow with empty messages have been added.
  2. A new test case for ERC20 deposit with empty message has been added.
  3. Consider adding a comment for clarity above the new ETH test cases.
  4. For completeness, consider adding an ERC20 withdrawal test case with empty message.

These changes contribute to a more robust testing suite, ensuring the reliability of the new empty message handling functionality.

x/crosschain/types/message_vote_inbound.go (1)

41-46: Commendable implementation of the option pattern.

The WithCrossChainCall function is a well-structured option setter for the MsgVoteInbound struct. It adheres to Go's idiomatic practices and provides a clear, concise way to set the IsCrossChainCall field.

x/fungible/keeper/deposits.go (2)

48-58: Approve: Updated ProcessV2Deposit function call

The modification to include the isCrossChainCall parameter in the ProcessV2Deposit function call is correct and consistent with the changes in the function signature. This change appropriately handles the new parameter for V2 protocol contracts while maintaining backward compatibility.


Line range hint 38-58: Summary: Effective implementation of cross-chain call support

The changes to the ZRC20DepositAndCallContract function effectively implement support for differentiating between standard deposits and cross-chain calls. The modification is well-structured, maintains backward compatibility, and aligns with the PR objectives. The implementation is clean and doesn't introduce unnecessary complexity.

To further enhance the code:

  1. Consider adding documentation for the new isCrossChainCall parameter.
  2. Ensure that all calls to this function across the codebase have been updated accordingly.

Overall, the changes provide a solid foundation for handling cross-chain calls in the ZetaChain ecosystem.

pkg/contracts/testdappv2/TestDAppV2.abi (2)

2-14: Approval: NO_MESSAGE_CALL function addition is appropriate.

The new NO_MESSAGE_CALL function aligns with the PR objectives by providing a mechanism to handle calls with no message. The function signature and "view" stateMutability are consistent with Solidity best practices.


Line range hint 1-145: Summary: ABI changes align with PR objectives.

The additions to the TestDAppV2 ABI, namely the NO_MESSAGE_CALL and getNoMessageIndex functions, are well-aligned with the PR objectives of supporting depositAndCall and withdrawAndCall with empty messages. These minimal, focused changes enhance the contract's capability to handle no-message scenarios without modifying existing functionality, thus maintaining backward compatibility and reducing the risk of regression.

e2e/runner/v2_zevm.go (1)

Line range hint 1-245: Overall assessment: Changes align with PR objectives and improve code clarity.

The modifications in this file successfully address the PR objectives by introducing new functions and renaming existing ones to support depositAndCall and withdrawAndCall with empty messages. The changes maintain consistency in error handling and gas limit management across functions.

Key improvements:

  1. Clear distinction between arbitrary and authenticated calls.
  2. Introduction of contract-based interactions using GatewayZEVMCaller.
  3. Consistent handling of increased gas limits for complex operations.

These changes enhance the functionality and clarity of the ZetaChain node's interaction with the ZEVM gateway. To further improve the codebase, consider implementing the suggested minor enhancements for consistency and clarity across all functions.

x/fungible/keeper/v2_deposits_test.go (1)

Line range hint 1-270: Comprehensive test suite with room for minor enhancements.

The modifications to v2_deposits_test.go significantly improve the test coverage for the ProcessV2Deposit function, aligning well with the PR objectives. The new helper function and test cases effectively address the handling of deposits with and without messages, including cross-chain calls.

To further elevate the quality of this test suite:

  1. Consider implementing property-based testing for more exhaustive coverage of edge cases.
  2. Enhance error case handling across all test scenarios.
  3. Implement consistent gas consumption checks to ensure efficiency.
  4. Add more granular event verification in all test cases.

These enhancements would result in a more robust and comprehensive test suite, providing stronger guarantees for the correct functioning of the deposit processing logic.

x/crosschain/types/cctx.go (1)

240-240: Approve addition of IsCrossChainCall field with suggestions for improvement

The addition of the IsCrossChainCall field to the InboundParams struct aligns with the PR objectives and enhances the cross-chain functionality. However, consider the following improvements:

  1. Add validation for this new field in the Validate() method of InboundParams.
  2. Update relevant methods within this file to utilize this new field where appropriate.
  3. Consider adding documentation to explain the purpose and usage of this field.

To ensure consistent usage across the codebase, run the following script:

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 240-240: x/crosschain/types/cctx.go#L240
Added line #L240 was not covered by tests

x/fungible/keeper/deposits_test.go (2)

403-403: Approve changes with suggestion for consistency and emphasis on V2 testing

The addition of the false parameter is correct and crucial for testing the V2 functionality. To maintain consistency with previous suggestions and improve code clarity, consider using a named parameter:

isCrossChainCall: false,

This change would ensure a uniform style across all test cases and enhance the overall readability of the test suite.

Additionally, given the importance of V2 functionality mentioned in the PR objectives, consider adding more comprehensive test cases for V2 deposits, including scenarios with isCrossChainCall set to true.


Line range hint 1-458: Summary of changes and suggestions for improvement

The modifications to add the isCrossChainCall parameter to all ZRC20DepositAndCallContract method calls are consistent and align with the PR objectives. To further enhance the test suite:

  1. Consider using named parameters for the isCrossChainCall argument across all test cases to improve readability.
  2. Add more comprehensive test cases for V2 functionality, including scenarios where isCrossChainCall is set to true.
  3. Ensure that edge cases and potential failure scenarios for cross-chain calls are adequately covered in the test suite.

These improvements will enhance the overall quality and coverage of the test suite, ensuring robust functionality of the ZRC20DepositAndCallContract method.

testutil/keeper/crosschain.go (1)

Line range hint 403-411: Approve changes to MockVoteOnOutboundSuccessBallot.

The modifications to MockVoteOnOutboundSuccessBallot enhance its flexibility by introducing the observer parameter. This change allows for more comprehensive testing scenarios, particularly in simulating different observer behaviors.

go.mod (3)

Line range hint 3-5: Toolchain update approved.

The Go toolchain version has been updated from 1.22.2 to 1.22.5. This minor version update is beneficial as it likely includes bug fixes and security improvements.


Line range hint 1-399: Summary of changes and recommendations.

The go.mod file has undergone significant updates:

  1. Go toolchain version updated to 1.22.5.
  2. New dependencies added and existing ones updated.
  3. Several dependencies replaced with ZetaChain-maintained forks.

Recommendations:

  1. Ensure all new dependencies are necessary and align with the project's objectives.
  2. Regularly update and maintain the ZetaChain forks to incorporate upstream changes.
  3. Update the project documentation to reflect these dependency changes, if applicable.
  4. Consider running a thorough test suite to ensure compatibility with the updated dependencies.

62-62: New dependencies and version updates noted.

The github.com/zeta-chain/protocol-contracts dependency has been updated to a newer version. Additionally, new dependencies have been introduced:

  • github.com/bnb-chain/tss-lib v1.5.0
  • github.com/showa-93/go-mask v0.6.2
  • github.com/tonkeeper/tongo v1.9.3

Please ensure that these new dependencies are necessary and that their introduction aligns with the project's objectives.

To verify the usage of these new dependencies, please run the following script:

Also applies to: 370-374

✅ Verification successful

New dependencies are appropriately integrated and utilized.

All newly introduced dependencies are actively used across various components of the codebase, ensuring they are necessary and align with the project's objectives.

  • github.com/bnb-chain/tss-lib is used in:

    • zetaclient/tss/tss_signer.go
    • cmd/zetaclientd/gen_pre_params.go
    • cmd/zetaclientd/main.go
  • github.com/showa-93/go-mask is used in:

    • zetaclient/config/types.go
  • github.com/tonkeeper/tongo is extensively used in multiple files including orchestrators, test utilities, and contract modules.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for the usage of new dependencies in the codebase.

echo "Checking usage of new dependencies:"
for dep in "github.com/bnb-chain/tss-lib" "github.com/showa-93/go-mask" "github.com/tonkeeper/tongo"; do
    echo "Usage of $dep:"
    rg --type go "$dep"
    echo
done

Length of output: 4856


Script:

#!/bin/bash
# Description: Analyze detailed usage of new dependencies in the codebase.

echo "Analyzing imports for github.com/bnb-chain/tss-lib:"
rg --type go 'import\s+"github.com/bnb-chain/tss-lib"' --context 2
echo

echo "Analyzing imports for github.com/showa-93/go-mask:"
rg --type go 'import\s+"github.com/showa-93/go-mask"' --context 2
echo

echo "Analyzing imports for github.com/tonkeeper/tongo:"
rg --type go 'import\s+"github.com/tonkeeper/tongo' --context 2
echo

echo "Identifying specific functions from github.com/bnb-chain/tss-lib:"
rg --type go 'tss-lib/[^ ]+' 
echo

echo "Identifying specific functions from github.com/showa-93/go-mask:"
rg --type go 'go-mask/[^ ]+' 
echo

echo "Identifying specific functions from github.com/tonkeeper/tongo:"
rg --type go 'tongo/[^ ]+' 
echo

Length of output: 5092

x/crosschain/keeper/evm_deposit_test.go (6)

Line range hint 149-157: LGTM. Changes are consistent.

The modification to the ZRC20DepositAndCallContract mock function call is consistent with the previous test case and aligns with the PR objectives.


Line range hint 213-221: LGTM. Consistent implementation.

The changes to this test case are consistent with the previous modifications and align with the PR objectives.


Line range hint 304-312: LGTM. Consistent modification.

The changes to this test case maintain consistency with the previous modifications and align with the PR objectives.


Line range hint 350-358: LGTM. Consistent implementation.

The modifications to this test case are in line with the previous changes and adhere to the PR objectives.


Line range hint 395-403: LGTM. Consistent modification.

The changes to this test case maintain consistency with the previous modifications and align with the PR objectives.


Line range hint 1-611: Overall, the changes are consistent and improve test coverage.

The modifications to this test file are consistent across all test cases and align well with the PR objectives. The addition of the new parameter to the ZRC20DepositAndCallContract mock function calls reflects the changes made to the underlying implementation. These updates enhance the test coverage for the new functionality introduced in the PR, particularly the support for depositAndCall and withdrawAndCall with empty messages.

e2e/e2etests/e2etests.go (3)

133-139: Appropriate addition of new constants.

The new constants for V2 ETH deposit and withdrawal with no message are well-placed and follow the existing naming convention.


145-151: Consistent addition of new ERC20 constants.

The new constants for V2 ERC20 deposit and withdrawal with no message maintain consistency with the existing naming convention and are correctly positioned within the V2 smart contract tests section.


738-745: Well-structured new E2ETest for V2 ETH deposit and call with no message.

The new E2ETest for V2 ETH deposit and call with no message content is correctly structured and maintains consistency with existing tests. The description and default value are appropriate.

testutil/sample/crosschain.go (4)

308-310: Approve renaming of GetInvalidZRC20WithdrawToExternal.

The renaming of GetInvalidZRC20WithdrawToExternal to InvalidZRC20WithdrawToExternalReceipt enhances code clarity and maintains consistency with other function names in the file. This change improves overall code readability and maintainability.


325-327: Approve renaming of GetValidZRC20WithdrawToBTC and comment enhancement.

The renaming of GetValidZRC20WithdrawToBTC to ValidZRC20WithdrawToBTCReceipt improves code clarity and maintains consistency with other function names. The additional comment providing the receiver address enhances the context and usability of the function.


334-335: Approve renaming of GetValidZetaSentDestinationExternal.

The renaming of GetValidZetaSentDestinationExternal to ValidZetaSentDestinationExternalReceipt enhances code clarity and maintains consistency with other function names in the file. This change contributes to improved overall code readability and maintainability.


Line range hint 1-335: Summary of changes in testutil/sample/crosschain.go.

The modifications in this file consist of renaming four functions related to generating test data for cross-chain transactions. These changes enhance code clarity and maintain consistency in naming conventions. The refactoring aligns with the PR objectives of improving functionality and clarity in the ZetaChain ecosystem.

Key points:

  1. All changes are cosmetic and do not alter existing logic or introduce new functionality.
  2. The new function names are more descriptive and follow a consistent pattern.
  3. Comments have been updated to reflect the new function names, with some providing additional context.

These improvements contribute to better code readability and maintainability, which is crucial for test utilities in a complex system like ZetaChain.

x/crosschain/keeper/evm_hooks_test.go (10)

Line range hint 105-114: LGTM: Sample data retrieval method updated correctly.

The changes to use InvalidZRC20WithdrawToExternalReceipt are appropriate and maintain the existing test logic.


Line range hint 119-128: LGTM: Sample data retrieval method updated correctly for BTC withdrawal.

The changes to use ValidZRC20WithdrawToBTCReceipt are appropriate and maintain the existing test logic for BTC withdrawals.


Line range hint 134-143: LGTM: Sample data retrieval method updated correctly for ETH withdrawal.

The changes to use ValidZrc20WithdrawToETHReceipt are appropriate and maintain the existing test logic for ETH withdrawals.


Line range hint 149-153: LGTM: Sample data retrieval method updated correctly for negative test case.

The changes to use ValidZRC20WithdrawToBTCReceipt in the negative test case are appropriate and maintain the existing test logic.


161-162: LGTM: Sample data retrieval methods updated consistently.

The changes to use the new receipt retrieval methods (ValidZRC20WithdrawToBTCReceipt) are applied consistently across different test scenarios, maintaining the existing test logic.

Also applies to: 171-172, 189-190, 199-200


251-252: LGTM: Sample data retrieval methods updated consistently for various scenarios.

The changes to use the new receipt retrieval methods (ValidZRC20WithdrawToBTCReceipt, ValidZrc20WithdrawToETHReceipt) are applied consistently across different test scenarios, maintaining the existing test logic for ZRC20 withdrawals and ETH receipts.

Also applies to: 277-278, 302-303, 321-322, 342-343, 365-366


390-391: LGTM: Sample data retrieval methods updated consistently for various scenarios.

The changes to use the new receipt retrieval methods (ValidZrc20WithdrawToETHReceipt, ValidZetaSentDestinationExternalReceipt) are applied consistently across different test scenarios, maintaining the existing test logic for ZRC20 withdrawals, ETH receipts, and ZetaSent events.

Also applies to: 418-419, 444-445, 459-460, 476-477, 487-488


525-526: LGTM: Sample data retrieval methods updated consistently for ZetaSent scenarios.

The changes to use the new receipt retrieval method (ValidZetaSentDestinationExternalReceipt) are applied consistently across different test scenarios, maintaining the existing test logic for ZetaSent events.

Also applies to: 561-562, 591-592, 623-624, 654-655, 692-693


715-716: LGTM: Sample data retrieval methods updated consistently for various scenarios.

The changes to use the new receipt retrieval methods (ValidZRC20WithdrawToBTCReceipt, ValidZetaSentDestinationExternalReceipt, InvalidZRC20WithdrawToExternalReceipt) are applied consistently across different test scenarios, maintaining the existing test logic for ZRC20 withdrawals, ZetaSent events, and invalid withdrawal cases.

Also applies to: 752-753, 782-783, 797-798, 820-821, 843-844, 868-869, 889-890


Line range hint 1-901: Overall assessment: Sample data retrieval methods updated successfully.

The changes in this file consistently update the sample data retrieval methods across various test scenarios. These updates maintain the existing test logic while presumably improving consistency or functionality in the test data generation. The modifications appear to be part of a larger refactoring effort and have been applied correctly throughout the file.

changelog.md (3)

Line range hint 1-56: LGTM: Comprehensive changelog structure

The changelog is well-structured, providing a clear overview of changes across multiple versions. It includes sections for Features, Fixes, Refactor, Tests, and CI, which is a good practice for maintaining a detailed history of changes.


Line range hint 59-1589: LGTM: Detailed changelog entries

The changelog entries provide comprehensive information about changes, fixes, and improvements across multiple versions. This level of detail is beneficial for tracking the project's evolution and understanding the impact of each release.


Line range hint 1-1589: Overall assessment: Well-maintained and informative changelog

The changelog is comprehensive, well-structured, and provides valuable information about each release. It follows good practices by categorizing changes into Features, Fixes, Refactor, Tests, and CI sections. This format makes it easy for users and developers to understand the evolution of the project and the impact of each release.

Minor suggestions:

  1. Consider standardizing event names for consistency (e.g., WithdrawedAndCalled to WithdrawnAndCalled).
  2. Maintain the current level of detail in future entries to ensure continued clarity and usefulness of the changelog.
e2e/e2etests/test_v2_eth_withdraw_and_call_no_message.go (9)

1-14: Package declaration and imports are appropriate

The package is correctly declared as e2etests, and all necessary imports are included for the functionality of the test.


15-17: Function definition and argument validation are correct

The test function TestV2ETHWithdrawAndCallNoMessage is properly defined with parameters that suit its purpose. It correctly checks that exactly one argument (the amount to withdraw) is provided.


18-23: Temporary gas limit adjustment is correctly handled

The gas limit is temporarily increased to 10,000,000 to accommodate the test requirements. The use of defer ensures that the original gas limit is restored after the test execution, maintaining the integrity of subsequent tests.


24-26: Amount parsing and validation are properly implemented

The amount is safely parsed from the input arguments using big.NewInt(0).SetString(args[0], 10), and the validity is verified. The use of require.True ensures that the test fails with a clear message if the amount is invalid.


27-28: ETH ZRC20 approval is correctly performed

The test appropriately calls r.ApproveETHZRC20 with the gateway address to ensure that the necessary approvals are in place before performing the withdrawal.


30-35: Withdrawal transaction is executed with correct parameters

The V2ETHWithdrawAndCall function is invoked with the correct parameters, including an empty byte slice for the message and appropriate RevertOptions. This aligns with the test objective of handling withdrawals without a message.


37-41: Cross-chain transaction status is accurately verified

The test waits for the cross-chain context (cctx) to be mined and asserts that the status is OutboundMined. This ensures that the withdrawal process has been successfully completed on the cross-chain network.


43-46: DApp call verification is successfully conducted

The test retrieves the messageIndex and uses AssertTestDAppEVMCalled to verify that the DApp was called as expected with the correct amount. Error handling is properly managed with require.NoError.


52-53: Sender verification is correctly implemented

The test verifies that the sender used in the DApp matches the expected address (r.ZEVMAuth.From). Error handling is appropriately managed with require.NoError, and the equality assertion ensures the integrity of the sender information.

x/fungible/keeper/v2_deposits.go (2)

36-43: Verify the completeness and correctness of conditional logic

The conditional branches based on coinType and isCrossChainCall determine the execution path of the deposit processing. Ensure that all possible combinations of coinType and isCrossChainCall are appropriately handled and that the logic aligns with the intended functionality to prevent unexpected behaviors.


47-48: Ensure fallback to simple deposit is appropriate

The default execution of DepositZRC20 for cases not covered by the previous conditions assumes a simple deposit is required. Confirm that this fallback correctly represents all remaining scenarios and that no specific cases are unintentionally omitted from the conditional logic.

x/crosschain/keeper/v2_zevm_inbound.go (1)

54-54: 🛠️ Refactor suggestion

Adjust logging level for normal processing

The log message at line 54 uses the Error level to indicate the processing of an inbound transaction, which is a standard operation. It's more appropriate to use the Info or Debug level for such messages to avoid confusion and ensure that actual errors are not obscured by routine logs.

Apply this change to adjust the log level:

-        k.Logger(ctx).Error(fmt.Sprintf("processing inbound. zrc20: %s", zrc20.Hex()))
+        k.Logger(ctx).Info(fmt.Sprintf("Processing inbound transaction. zrc20: %s", zrc20.Hex()))

Likely invalid or redundant comment.

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 54-54: x/crosschain/keeper/v2_zevm_inbound.go#L54
Added line #L54 was not covered by tests

pkg/contracts/testdappv2/TestDAppV2.sol (1)

2-2: Ensure Compatibility with Updated Solidity Version

The pragma has been updated to ^0.8.26. Please verify that all dependencies and deployment tools are compatible with Solidity version 0.8.26 to prevent any potential compatibility issues.

zetaclient/chains/evm/observer/v2_inbound.go (1)

202-202: Confirm proper inclusion of isCrossChainCall flag.

Including the isCrossChainCall flag ensures that the MsgVoteInbound message accurately represents whether the event involves a cross-chain call, aligning with the updated protocol specifications.

pkg/contracts/testdappv2/TestDAppV2.go (3)

54-55: Ensure ABI and binary data are correctly updated

The ABI and Bin fields in TestDAppV2MetaData have been modified. Please verify that they accurately represent the updated contract and are consistent with the corresponding Solidity code to prevent any discrepancies during deployment or interaction.


242-255: Ensure consistency in session methods for NOMESSAGECALL

The session methods for NOMESSAGECALL have been added. Verify that they align correctly with the caller methods and function as intended in different session contexts.

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 245-246: pkg/contracts/testdappv2/TestDAppV2.go#L245-L246
Added lines #L245 - L246 were not covered by tests


[warning] 252-253: pkg/contracts/testdappv2/TestDAppV2.go#L252-L253
Added lines #L252 - L253 were not covered by tests


397-410: Validate session methods for GetNoMessageIndex

The session methods related to GetNoMessageIndex have been added. Ensure that these methods are consistent with the caller implementations and correctly handle different call options.

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 400-401: pkg/contracts/testdappv2/TestDAppV2.go#L400-L401
Added lines #L400 - L401 were not covered by tests


[warning] 407-408: pkg/contracts/testdappv2/TestDAppV2.go#L407-L408
Added lines #L407 - L408 were not covered by tests

x/crosschain/types/inbound_parsing_test.go Show resolved Hide resolved
x/crosschain/types/inbound_parsing_test.go Show resolved Hide resolved
x/crosschain/types/inbound_parsing_test.go Show resolved Hide resolved
x/crosschain/types/inbound_parsing_test.go Show resolved Hide resolved
x/crosschain/types/inbound_parsing_test.go Outdated Show resolved Hide resolved
zetaclient/chains/evm/observer/v2_inbound.go Show resolved Hide resolved
zetaclient/chains/evm/observer/inbound.go Show resolved Hide resolved
zetaclient/chains/evm/observer/inbound.go Show resolved Hide resolved
pkg/contracts/testdappv2/TestDAppV2.go Show resolved Hide resolved
pkg/contracts/testdappv2/TestDAppV2.go Show resolved Hide resolved
Copy link
Contributor

@ws4charlie ws4charlie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The fix and zetaclient update looks good to me. One minor question.

@lumtis lumtis added this pull request to the merge queue Oct 22, 2024
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Oct 22, 2024
@lumtis lumtis added this pull request to the merge queue Oct 22, 2024
Merged via the queue into develop with commit 41ec117 Oct 22, 2024
34 of 35 checks passed
@lumtis lumtis deleted the feat/transferAndCall branch October 22, 2024 09:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
breaking:cli breaking:proto UPGRADE_LIGHT_TESTS Run make start-upgrade-test-light V2_TESTS Run make start-v2-test
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Introduce a new type of cctx to authorize depositAndCall and withdrawAndCall without message
3 participants